﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using RzCorportativo.DataAccess;

namespace RzCorportativo.Lib
{
    public class Cidade
    {
        public int CidadeId { get; set; }
        public string Nome { get; set; }
        public Uf UF { get; set; }
        public bool IsNew { get { return this.CidadeId == 0; } }
        private RzCorportativo.DataAccess.Cidade model;

        public bool Salvar()
        {
            bool @result = false;
            Transaction.Begin((entity) =>
            {
                if (this.IsNew)
                    this.model = this.Insert(entity);
                else
                    this.model = this.Update(entity);
                return true;
            }).OnError((ex) =>
            {
                @result = false;
            }).OnSuccess(() =>
            {
                @result = true;
                this.CidadeId = this.model.CidadeId;
            });
            return @result;
        }

        private RzCorportativo.DataAccess.Cidade Insert(SistemaCurricularEntities entity)
        {
            var @item = this.CreateModel(entity);
            entity.AddToCidade(@item);
            return @item;
        }

        private RzCorportativo.DataAccess.Cidade Update(SistemaCurricularEntities entity)
        {
            var @item = this.CreateModel(entity);
            return @item;
        }

        private RzCorportativo.DataAccess.Cidade CreateModel(SistemaCurricularEntities entity)
        {
            var cidade = new RzCorportativo.DataAccess.Cidade();
            if (!this.IsNew)
            {
                cidade = entity.Cidade.Where(w => w.CidadeId == this.CidadeId).FirstOrDefault();
                if (cidade == null)
                    throw new Exception("Código inválido");
            }

            cidade.CidadeId = this.CidadeId;
            cidade.UF = (this.UF ?? new Uf()).UF.ToUpper();
            cidade.Nome = (this.Nome ?? string.Empty).ToUpper();
            return cidade;
        }

        internal Cidade CreateCidade(RzCorportativo.DataAccess.Cidade item)
        {
            if (item == null)
                return null;
            Cidade cidade = new Cidade();
            cidade.CidadeId = item.CidadeId;
            if (!string.IsNullOrEmpty(item.UF))
                cidade.UF = new Uf()
                {
                    UF = item.UF
                };
            cidade.Nome = (item.Nome ?? string.Empty).ToUpper();
            return cidade;
        }

        public static List<Lib.Cidade> Listar(Lib.Cidade cidade)
        {
            if (cidade == null)
                cidade = new Cidade();
            List<Cidade> cidades = new List<Cidade>();
            RzCorportativo.DataAccess.SistemaCurricularEntities db = new SistemaCurricularEntities();
            string ufValue = (cidade.UF ?? new Uf()).UF;
            
            cidades = db.Cidade.Where(w =>
                    ((cidade.CidadeId == 0) || (cidade.CidadeId == w.CidadeId)) &&
                    ((cidade.Nome == null || cidade.Nome == "") || (w.Nome.Contains(cidade.Nome))) &&
                    ((ufValue == "") || (ufValue == w.UF))
                ).ToList().Select(s => cidade.CreateCidade(s)).ToList();
            return cidades;
        }

        public bool Excluir()
        {
            bool retorno = false;
            Transaction.Begin((context) =>
            {
                context.Cidade.DeleteObject(this.CreateModel(context));
                retorno = true;
                return true;
            }).OnError(exception =>
            {
                throw exception;
            }).OnSuccess(() =>
            {

            });
            return retorno;
        }
    }
}
